package web.beans;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.SelectEvent;

import ejb.dto.EscursioneDTO;
import ejb.dto.HotelDTO;
import ejb.dto.PacchettoDTO;
import ejb.dto.ProdottoBaseDTO;
import ejb.dto.VoloDTO;
import ejb.managerbeans.EscursioneManagerBeanLocal;
import ejb.managerbeans.HotelManagerBeanLocal;
import ejb.managerbeans.PackManagerBeanLocal;
import ejb.managerbeans.VoloManagerBeanLocal;

@ManagedBean(name = "researchBean")
@ViewScoped
public class ResearchBean {

	@EJB
	private VoloManagerBeanLocal voloMgr;

	@EJB
	private HotelManagerBeanLocal hotelMgr;

	@EJB
	private EscursioneManagerBeanLocal escursioneMgr;

	@EJB
	private PackManagerBeanLocal pacchettoMgr;

	@ManagedProperty(value = "#{buyBean}")
	private BuyBean buy;

	@ManagedProperty(value = "#{giftlistBean}")
	private GiftListBean gf;

	private String selectedProd = "flight";
	private String searchedProd = "";

	private Date today = new Date();

	private Date departureDate = new Date();
	private Date returnDate;
	private String departureCity;
	private String arrivalCity;
	private int guests = 1;

	private ProdottoBaseDTO prodottoBase;

	private VoloDTO volo;
	private HotelDTO hotel;
	private EscursioneDTO escursione;
	private PacchettoDTO pacchetto;

	private List<VoloDTO> voloList;
	private List<HotelDTO> hotelList;
	private List<EscursioneDTO> escursioneList;
	private List<PacchettoDTO> pacchettoList;

	private boolean renderVoloList;
	private boolean renderHotelList;
	private boolean renderEscursioneList;
	private boolean renderPacchettoList;

	@PostConstruct
	public void init() {
		prodottoBase = new ProdottoBaseDTO();
		volo = new VoloDTO();
		hotel = new HotelDTO();
		escursione = new EscursioneDTO();
		pacchetto = new PacchettoDTO();

		voloList = new ArrayList<VoloDTO>();
		hotelList = new ArrayList<HotelDTO>();
		escursioneList = new ArrayList<EscursioneDTO>();
		pacchettoList = new ArrayList<PacchettoDTO>();

		renderVoloList = false;
		renderHotelList = false;
		renderEscursioneList = false;
		renderPacchettoList = false;
	}

	public BuyBean getBuy() {
		return buy;
	}

	public void setBuy(BuyBean buy) {
		this.buy = buy;
	}

	public GiftListBean getGf() {
		return gf;
	}

	public void setGf(GiftListBean gf) {
		this.gf = gf;
	}

	public ProdottoBaseDTO getProdottoBase() {
		return prodottoBase;
	}

	public void setProdottoBase(ProdottoBaseDTO prodottoBase) {
		this.prodottoBase = prodottoBase;
	}

	public VoloDTO getVolo() {
		return volo;
	}

	public void setVolo(VoloDTO volo) {
		this.volo = volo;
	}

	public HotelDTO getHotel() {
		return hotel;
	}

	public void setHotel(HotelDTO hotel) {
		this.hotel = hotel;
	}

	public EscursioneDTO getEscursione() {
		return escursione;
	}

	public void setEscursione(EscursioneDTO escursione) {
		this.escursione = escursione;
	}

	public PacchettoDTO getPacchetto() {
		return pacchetto;
	}

	public void setPacchetto(PacchettoDTO pacchetto) {
		this.pacchetto = pacchetto;
	}

	public String getSelectedProd() {
		return selectedProd;
	}

	public void setSelectedProd(String selectedProd) {
		this.selectedProd = selectedProd;
	}

	public Date getToday() {
		return today;
	}

	public void setToday(Date today) {
		this.today = today;
	}

	public Date getDepartureDate() {
		return departureDate;
	}

	public void setDepartureDate(Date departureDate) {
		this.departureDate = departureDate;
	}

	public Date getReturnDate() {
		return returnDate;
	}

	public void setReturnDate(Date returnDate) {
		this.returnDate = returnDate;
	}

	public String getDepartureCity() {
		return departureCity;
	}

	public void setDepartureCity(String departureCity) {
		this.departureCity = departureCity;
	}

	public String getArrivalCity() {
		return arrivalCity;
	}

	public void setArrivalCity(String arrivalCity) {
		this.arrivalCity = arrivalCity;
	}

	public int getGuests() {
		return guests;
	}

	public void setGuests(int guests) {
		this.guests = guests;
	}

	public List<VoloDTO> getVoloList() {
		return voloList;
	}

	public void setVoloList(List<VoloDTO> voloList) {
		this.voloList = voloList;
	}

	public List<HotelDTO> getHotelList() {
		return hotelList;
	}

	public void setHotelList(List<HotelDTO> hotelList) {
		this.hotelList = hotelList;
	}

	public List<EscursioneDTO> getEscursioneList() {
		return escursioneList;
	}

	public void setEscursioneList(List<EscursioneDTO> escursioneList) {
		this.escursioneList = escursioneList;
	}

	public List<PacchettoDTO> getPacchettoList() {
		return pacchettoList;
	}

	public void setPacchettoList(List<PacchettoDTO> pacchettoList) {
		this.pacchettoList = pacchettoList;
	}

	public boolean isRenderVoloList() {
		return renderVoloList;
	}

	public boolean isRenderHotelList() {
		return renderHotelList;
	}

	public boolean isRenderEscursioneList() {
		return renderEscursioneList;
	}

	public boolean isRenderPacchettoList() {
		return renderPacchettoList;
	}

	/**
	 * ricerca voli
	 */
	public void searchVolo() {

		voloList = voloMgr.getVoloDTODatesCities(volo);
		searchedProd = "flight";
		renderVoloList = true;
		volo = new VoloDTO();

	}

	/**
	 * ricerca hotels
	 */
	public void searchHotel() {

		hotelList = hotelMgr.getHotelDTODatesCity(hotel);
		searchedProd = "hotel";
		renderHotelList = true;
		hotel = new HotelDTO();

	}

	/**
	 * ricerca escursioni
	 */
	public void searchEscursione() {

		escursioneList = escursioneMgr.getEscursioneDTODateCity(escursione);
		searchedProd = "excursion";
		renderEscursioneList = true;
		escursione = new EscursioneDTO();

	}

	/**
	 * ricerca pacchetti (!solo per utenti registrati)
	 */
	public void searchPacchetto() {

		pacchettoList = pacchettoMgr.getPackDTOPerDate(pacchetto);
		searchedProd = "pack";
		renderPacchettoList = true;
		pacchetto = new PacchettoDTO();

	}

	public void buySelected(SelectEvent event) {

		ConfigurableNavigationHandler nh = (ConfigurableNavigationHandler) FacesContext
				.getCurrentInstance().getApplication().getNavigationHandler();
		nh.performNavigation("buyingDetails?faces-redirect=true");

		buy.setVolo(volo);
		buy.setHotel(hotel);
		buy.setEscursione(escursione);
		buy.setPacchetto(pacchetto);
		buy.setSearchedProd(searchedProd);
		buy.setGuests(guests);

		// return "buyingDetails?faces-redirect=true";

	}

	public String addToGF() {

		// System.out.println("trying to add to giftlist");

		gf.setRenderAddingSection(true);

		if (searchedProd.equals("pack")) {
			gf.setP(pacchetto);
			gf.setAddedProd(1);
		} else {
			if (searchedProd.equals("flight")) {
				prodottoBase.setId(volo.getId());
				prodottoBase.setDataInizio(volo.getDataInizio());
				prodottoBase.setDataFine(volo.getDataFine());
				prodottoBase.setPrezzo(volo.getPrezzo());
				prodottoBase.setNposti(volo.getNposti());

			} else if (searchedProd.equals("hotel")) {
				prodottoBase.setId(hotel.getId());
				prodottoBase.setDataInizio(hotel.getDataInizio());
				prodottoBase.setDataFine(hotel.getDataFine());
				prodottoBase.setPrezzo(hotel.getPrezzo());
				prodottoBase.setNposti(hotel.getNposti());

			} else if (searchedProd.equals("excursion")) {
				prodottoBase.setId(escursione.getId());
				prodottoBase.setDataInizio(escursione.getDataInizio());
				prodottoBase.setDataFine(escursione.getDataFine());
				prodottoBase.setPrezzo(escursione.getPrezzo());
				prodottoBase.setNposti(escursione.getNposti());
			}
			gf.setPb(prodottoBase);
			gf.setAddedProd(2);

		}
		gf.populateListForAdding();

		return "aggiungiAGiftList?faces-redirect=true";

	}

}
